package cn.tedu.search.repository;

import cn.tedu.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

// Repository是Spring家族框架对持久层出现的类\接口的命名规范
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {

    // ItemRepository接口继承SpringData框架提供的ElasticsearchRepository父接口
    // 继承之后当前接口就能够使用父接口中声明的操作Es的方法了
    // 父接口中的方法包含指定实体类对应ES索引的基本增删改查
    // ElasticsearchRepository<[要操作的实体类],[实体类的主键类型]>

    // SpringData自定义查询
    // 我们要编写一个遵循SpringData给定的方法名的格式
    // SpringData能够根据我们编写的方法名,推断出查询意图,自动生成能够完成这个查询的语句完成功能
    // query(查询):表达当前方法是一个查询方法,类似数据库sql语句的select
    // Item/Items:是要查询的实体类的名称,返回集合的查询应该以s结尾
    // By(通过/根据):标识开始设置查询条件的关键字,等价于sql语句中的where
    // Title:要查询的字段,可以是Item实体类中的任何字段
    // Matches(匹配):指定查询的操作条件,Matches是查询匹配关键词的行(document),类似于sql中的like

    Iterable<Item> queryItemsByTitleMatches(String title);


    // 多条件自定义查询
    // 多个条件之间要使用and或or进行分隔,表示多个条件之间的逻辑关系
    // 我们使用title和brand字段进行多条件查询
    // 参数的数量要匹配查询字段的数量
    // 声明参数的顺序就是赋值的依据,第一个参数会赋值给第一个条件,和参数名称无关

    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(String title,String brand);


    // 排序查询
    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
                                                    String title,String brand);

    // 分页查询
    // 要执行分页查询,需要将返回值类型修改为Page
    // 这个类型的对象支持保存所有查询结果的同时,保存分页信息,例如每页条数,当前页,总页数,总条数等
    // 参数方面,要在现有所有参数最后添加一个Pageable类型的参数
    // 这个参数会在方法被调用时,确定分页查询的页码和每页条数
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
                                String title, String brand, Pageable pageable);


}
